perm filename MOVARM.SAI[PNT,HE]6 blob sn#367364 filedate 1978-07-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY
C00004 00003	⊃ PROCEDURES FOR GENERATING CODE OF THE PDP-11
C00007 00004	INTERNAL PROCEDURE MMOVE(RPTR(FRAME)ARRAY FRS INTEGER NUMDEST(1) REAL TT(1.5))
C00011 00005	INTERNAL PROCEDURE DRIVE(INTEGER ARM,J,ABSREL REAL AMNT,TT(1.5))
C00013 00006	INTERNAL PROCEDURE CENTER(INTEGER ARM)
C00014 ENDMK
C⊗;
ENTRY;
BEGIN "MOVE  - GENERATES SIMPLE TRAJECTORY AND SENDS DATA TO BLUE ARM"
COMMENT ALL [PNT,HE] FILES COPIED OVER FROM [PNT,MSM] DEC 30,1977 ;
DEFINE ⊃="COMMENT";

DEFINE $MOVARM=TRUE;

REQUIRE "HEADER.SAI" SOURCE_FILE;
REQUIRE "MOVE.DEF[PNT,HE]" SOURCE_FILE;

INTEGER SEGS,TNUM,JTS,I,J,K;
INTEGER ARRAY DATA[1:1000];
INTEGER DUM, PTR;
REAL ARRAY DD[1:20],OLD[1:7],NEW[1:7];
! INTERNAL REAL BHAND;


DEFINE	MASTER="'54321";
DEFINE  MOVE_CODE= "'76";
DEFINE  CENTER_CODE= "'67";


⊃ PROCEDURES FOR GENERATING CODE OF THE PDP-11;

SIMPLE PROCEDURE INTOUT(INTEGER NUM);
	BEGIN
	DATA[PTR]←NUM;
	PTR←PTR+1;
	END;




⊃ PROCEDURE FOR SAVING A FLOATING POINT NUMBER IN 11 FORMAT IN THE DATA ARRAY;

SIMPLE PROCEDURE FLTOUT(REAL FNUM);
	BEGIN
	LABEL ST1,ST2,OVER,FLTEND;
	INTEGER BYTE,NUM1,NUM2;
	BYTE←'013200000002;
		START_CODE
		   	MOVE   2,FNUM;
			JUMPGE 2,ST1;
			MOVN   2,2;
 			TLO    2,'400000;
		ST1:	JFCL   2,ST2;
		ST2:	ADDI   2,4;
			JFCL   2,OVER;
     		    	DPB    2,BYTE;
			SETZ   1,;
			LSHC   1,16;
			MOVEM  1,NUM1;
			SETZ   1,;
			LSHC   1,16;
			MOVEM  1,NUM2;
		END;
	DATA[PTR]←NUM1;
	PTR←PTR+1;
	DATA[PTR]←NUM2;
	PTR←PTR+1;
	GOTO FLTEND;
OVER:	OUTSTR("ERROR-ROUNDING OVERFLOW"&CRLF);
FLTEND:	END; 
INTERNAL PROCEDURE MMOVE(RPTR(FRAME)ARRAY FRS; INTEGER NUMDEST(1); REAL TT(1.5));
BEGIN "MOVE"
	INTEGER JTS,TIME,SEGPTR,JOINT,FLAG;
	INTEGER MECH,BITS,ARM,NPOS;
	REAL DIF; REAL ARRAY DIFA[1:6];
	RPTR (FRAME)DEST;
	IF FRS[0]=F_BARM
		THEN BEGIN DUM←0; ARM←BLUE; MECH←BARM_MECH; BITS←BARMSB; END
		ELSE BEGIN DUM←1; ARM←YELLOW;MECH←YARM_MECH; BITS←YARMSB; END;

	READ_ARM(ARM); ARRTRAN(OLD,BANGLE);
⊃ SET UP THE COEFFICIENT LIST HEADER;
	SETFORMAT(10,3);
	JTS←6;
	SEGPTR←8+JTS*32;
	PTR←1;
⊃ ***** ; INTOUT(MOVE_CODE);
	INTOUT(BITS);
	INTOUT(0);
	INTOUT(0);
	INTOUT(0); ⊃ WOBBLE;

FOR NPOS←1 STEP 1 UNTIL NUMDEST DO
	BEGIN
	DEST←FRS[NPOS];
	FLAG←ARMSOL(ARM,NEW,DEST); ⊃ GIVES THE ANGLES OF THE NEW TRANSFORM;

	IF FLAG>0 THEN
		BEGIN
		STRING S; INTEGER I;
		S←CRLF&"CANT MOVE THERE,ERROR "&CVS(FLAG)&CRLF&"FOLLOWING JOINT(S) OUT OF RANGE: ";
		FOR I←1 STEP 1 UNTIL 7
			DO IF FLAG LAND (1 LSH (I-1)) THEN  S← S&"  "&CVS(I)&",";

		IF FLAG LAND '200 THEN ABORT1(CRLF&"TRYING TO PUSH ARM THROUGH TABLE");
		ABORT1(S[1 TO ∞ - 1]);
		END;

	TIME←TT*1000;
	FOR J←1 STEP 1 UNTIL JTS DO BEGIN
		DIFA[J]←NEW[J] - OLD[J];
		TIME← TIME MAX (400 + ABS(DIFA[J])*TIMFAC[ARM,J]/60);
		END;
			INTOUT(SEGPTR);
			INTOUT(TIME);
			INTOUT(0); INTOUT(0);

⊃ WRITE OUT THE POLYNOMIAL AND DYNAMIC COEFFICIENTS;

			FOR J←1 STEP 1 UNTIL JTS DO BEGIN
				JOINT←J;
				DIF←DIFA[JOINT];
				FLTOUT(OLD[JOINT]);
				FLTOUT(0.0);  FLTOUT(0.0);
				FLTOUT(10.0*DIF);
				FLTOUT(-15.0*DIF);
				FLTOUT(6.0*DIF);
			END;
!   ***************	DTERMS(DD,NEW[1],DUM);
			DTERMS(DD,NEW[1],MECH);
			FOR J←1 STEP 1 UNTIL JTS DO BEGIN
				K←(J-1)*2+1;
				FLTOUT(DD[K]);
				FLTOUT(DD[K+1]);
				OLD[J]←NEW[J];

			END;

	END;
	INTOUT(0);

	TLKEF3(MASTER,DATA); ⊃ tell to move;

END "MOVE";

	PRESET_WITH '100000,'40000,'20000,'10000,'4000,'2000,'1000,
			'400,'200,'100,'40,'20,'10,'4;
	INTEGER ARRAY JT_CODE[0:1,1:7];
INTERNAL PROCEDURE DRIVE(INTEGER ARM,J,ABSREL; REAL AMNT,TT(1.5));
BEGIN "DRIVE"
	⊃ DRIVES ONE JOINT;
	INTEGER JTS,SEGPTR,TIME,BITS,K1;
	REAL DIF, OLDJ,NEWJ;
	DUM ←IF J=7 THEN IF ARM=BLUE THEN BHAND_MECH ELSE YHAND_MECH
			ELSE IF ARM=BLUE THEN BARM_MECH ELSE YARM_MECH;

	BITS←JT_CODE[ARM,J];
	READ_ARM(ARM); ARRTRAN(OLD,BANGLE);
	OLDJ←OLD[J];
	IF ABSREL = ABS_MOTION THEN DIF←(NEWJ←AMNT)- OLDJ
		ELSE NEWJ←OLDJ+(DIF←AMNT);
	IF ¬(LOSTOP[ARM,J]≤NEWJ≤HISTOP[ARM,J]) THEN
		ABORT1(CRLF&"TRYING TO DRIVE JT["&CVS(J)&"] TO "&
				CVF(NEWJ)&" WHICH IS OUTSIDE JOINT LIMITS "&
				CVF(LOSTOP[ARM,J])&" AND "&CVF(HISTOP[ARM,J]));
	JTS←1; PTR←1; SEGPTR←8+JTS*32;
	SETFORMAT(10,3);
	INTOUT(MOVE_CODE);
	INTOUT(BITS);
	INTOUT(0);
	INTOUT(0);
	INTOUT(0);
	TIME←(TT MAX (ABS(TIMFAC[ARM,J]*DIF/60.0)+.4))*1000;
	INTOUT(SEGPTR);
	INTOUT(TIME);
	INTOUT(0);
	INTOUT(0);
	FLTOUT(OLDJ);
	FLTOUT(0.0);FLTOUT(0.0);
	FLTOUT(10.0*DIF);
	FLTOUT(-15.0*DIF);
	FLTOUT(6.0*DIF);
	FOR K1←1 STEP 1 UNTIL 7 DO NEW[K1]←OLD[K1];
	NEW[J]←NEWJ;
	DTERMS(DD,NEW[1],DUM);
	IF J=7 THEN K←1 ELSE K←(J -1)*2 +1;
	FLTOUT(DD[K]);
	FLTOUT(DD[K+1]);
	INTOUT(0);
	TLKEF3(MASTER,DATA); ⊃ TELL TO MOVE;
END "DRIVE";
INTERNAL PROCEDURE CENTER(INTEGER ARM);
BEGIN "CENTER"
	INTEGER BITS;
	IF ARM=BLUE THEN BITS←(BARMSB+BHANDSB) ELSE BITS←(YHANDSB+YARMSB);
	PTR←1;
	INTOUT(CENTER_CODE);
	INTOUT(BITS);
ifc false thenc 
	INTOUT(0);
	INTOUT(0);
	INTOUT(0);	⊃ NO WOBBLE;
	INTOUT(0);	⊃ NO NEXT SEGMENT;
	INTOUT(0);	⊃ NO FUNCTION TIME;
	INTOUT(0);	⊃ NO TRANSFORM;
	INTOUT(0);
	INTOUT(0);
elsec 	FOR BITS←1 STEP 1 UNTIL 8 DO INTOUT(0); endc
	TLKEF3(MASTER,DATA);
END "CENTER";


END;